package Generic;

/**
 * @author 王艺锡
 * @version 1.0
 */
//自定义类泛型
@SuppressWarnings({"all"})
public class CustomGeneric {
    public static void main(String[] args) {
        //1.普通成员可以使用泛型(属性，方法)
        //2.使用泛型的数组，不能初始化
        //3.静态方法中不能使用泛型
        //4.泛型的类型，是在创建对象时确认的(因为创建对象时，需要指定确定类型)
        //5.如果在创建对象时，没有指定类型，则默认为Object

        Tiger<Double, Integer, String> t1 = new Tiger<>("jack");
        t1.setT(10.9);//ok
        //t1.setT("hello");//err T此时是Double的引用类型，不可以传字符串
        System.out.println("t1:" + t1);
        Tiger t2 = new Tiger("lihua");
        t2.setT("yy");//ok  此时T M R都是默认的Object类型
        System.out.println("t2:" + t2);
    }
}
//Tiger类后面加泛型，称为自定义泛型类
//T,R,M为泛型标识符，一般是单个的大写字母
//泛型的标识符可以有多个
//普通成员可以使用泛型(属性，方法)
class Tiger<T,R,M>{
    String name;
    T t;//属性使用泛型
    R r;
    M m;

    //2.使用泛型的数组，不能初始化。因为数组在new的时候不能确定T的类型，就无法在内存开空间
    //T t1[] = new T[12];//err

    //3.静态方法中不能使用泛型
    //因为静态是和类相关的，在类的加载时，对象还没有创建，所以JVM机无法完成初始化
    //static R r2;
    //public static void f(M m){}


    public Tiger(String name) {
        this.name = name;
    }

    public Tiger(T t, R r, M m) {
        this.t = t;
        this.r = r;
        this.m = m;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public T getT() {//方法使用到泛型
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }

    public R getR() {
        return r;
    }

    public void setR(R r) {
        this.r = r;
    }

    public M getM() {
        return m;
    }

    public void setM(M m) {
        this.m = m;
    }

    @Override
    public String toString() {
        return "Tiger{" +
                "name='" + name + '\'' +
                ", t=" + t +
                ", r=" + r +
                ", m=" + m +
                '}';
    }
}
